<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Redis 分布式锁过期时间管理策略</title>
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
            min-height: 100vh;
        }
        .hero-gradient {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        .card-hover {
            transition: all 0.3s ease;
        }
        .card-hover:hover {
            transform: translateY(-5px);
            box-shadow: 0 20px 40px rgba(0,0,0,0.1);
        }
        .code-block {
            background: #1e1e1e;
            color: #d4d4d4;
            border-radius: 12px;
            overflow: hidden;
        }
        .code-block pre {
            padding: 1.5rem;
            overflow-x: auto;
        }
        .section-number {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            font-weight: 700;
            font-size: 3rem;
            line-height: 1;
        }
        .first-letter {
            float: left;
            font-size: 4rem;
            line-height: 1;
            font-weight: 700;
            margin-right: 0.5rem;
            color: #667eea;
            font-family: 'Noto Serif SC', serif;
        }
        .mermaid {
            display: flex;
            justify-content: center;
            margin: 2rem 0;
        }
    </style>
</head>
<body>
    <!-- Hero Section -->
    <section class="hero-gradient text-white py-20">
        <div class="container mx-auto px-6 text-center">
            <h1 class="text-5xl md:text-6xl font-bold mb-6 tracking-tight">
                Redis 分布式锁过期时间管理
            </h1>
            <p class="text-xl md:text-2xl mb-8 opacity-90 max-w-3xl mx-auto">
                深入探讨分布式系统中锁过期问题的解决方案与最佳实践
            </p>
            <div class="flex justify-center space-x-6 text-lg">
                <div class="flex items-center">
                    <i class="fas fa-clock mr-2"></i>
                    <span>阅读时间：8分钟</span>
                </div>
                <div class="flex items-center">
                    <i class="fas fa-layer-group mr-2"></i>
                    <span>难度：中级</span>
                </div>
            </div>
        </div>
    </section>

    <!-- Main Content -->
    <main class="container mx-auto px-6 py-12 max-w-6xl">
        <!-- Introduction Card -->
        <div class="bg-white rounded-2xl shadow-xl p-8 mb-12 card-hover">
            <p class="text-lg leading-relaxed text-gray-700">
                <span class="first-letter">在</span>使用 Redis 实现分布式锁时，如果锁的过期时间到达而任务仍未完成，这可能导致锁被自动释放，进而导致并发问题。为避免这种情况，通常需要采取一些措施来保证锁的可靠性和任务的完成。
            </p>
        </div>

        <!-- Mermaid Diagram -->
        <div class="bg-white rounded-2xl shadow-xl p-8 mb-12">
            <h2 class="text-2xl font-bold mb-6 text-center text-gray-800">分布式锁管理策略概览</h2>
            <div class="mermaid">
                graph TD
                    A[分布式锁过期问题] --> B[延长过期时间]
                    A --> C[可续约机制]
                    A --> D[合适的过期时间]
                    A --> E[自动续期]
                    A --> F[任务幂等性]
                    A --> G[锁释放机制]
                    
                    B --> B1[EXPIRE命令]
                    B --> B2[SET PX/EX参数]
                    
                    C --> C1[Redisson RLock]
                    C --> C2[程序逻辑续约]
                    
                    E --> E1[定时任务]
                    E --> E2[进度标记]
                    
                    G --> G1[超时处理]
                    G --> G2[异常处理]
                    
                    style A fill:#667eea,stroke:#fff,stroke-width:3px,color:#fff
                    style B fill:#f59e0b,stroke:#fff,stroke-width:2px,color:#fff
                    style C fill:#10b981,stroke:#fff,stroke-width:2px,color:#fff
                    style D fill:#3b82f6,stroke:#fff,stroke-width:2px,color:#fff
                    style E fill:#8b5cf6,stroke:#fff,stroke-width:2px,color:#fff
                    style F fill:#ef4444,stroke:#fff,stroke-width:2px,color:#fff
                    style G fill:#6366f1,stroke:#fff,stroke-width:2px,color:#fff
            </div>
        </div>

        <!-- Strategy Cards -->
        <div class="grid gap-8">
            <!-- Strategy 1 -->
            <div class="bg-white rounded-2xl shadow-xl overflow-hidden card-hover">
                <div class="flex">
                    <div class="w-24 flex items-center justify-center bg-gradient-to-br from-yellow-400 to-orange-500">
                        <span class="section-number text-white">1</span>
                    </div>
                    <div class="flex-1 p-8">
                        <h3 class="text-2xl font-bold mb-4 text-gray-800">
                            <i class="fas fa-hourglass-half mr-3 text-orange-500"></i>
                            延长锁的过期时间
                        </h3>
                        <p class="text-gray-700 mb-6 leading-relaxed">
                            在任务执行过程中，可以定期延长锁的过期时间。这通常是通过在任务的处理中周期性地更新锁的过期时间来实现的。这样，即使任务需要较长时间，锁也不会在处理完成之前过期。
                        </p>
                        <div class="bg-gray-50 rounded-lg p-4 mb-6">
                            <ul class="space-y-3">
                                <li class="flex items-start">
                                    <i class="fas fa-check-circle text-green-500 mt-1 mr-3"></i>
                                    <span class="text-gray-700">通过 Redis 的 <code class="bg-gray-200 px-2 py-1 rounded text-sm">EXPIRE</code> 命令来延长锁的过期时间。</span>
                                </li>
                                <li class="flex items-start">
                                    <i class="fas fa-check-circle text-green-500 mt-1 mr-3"></i>
                                    <span class="text-gray-700">使用 <code class="bg-gray-200 px-2 py-1 rounded text-sm">SET</code> 命令的 <code class="bg-gray-200 px-2 py-1 rounded text-sm">PX</code> 或 <code class="bg-gray-200 px-2 py-1 rounded text-sm">EX</code> 参数来设置初始的过期时间，并在任务执行过程中定期刷新。</span>
                                </li>
                            </ul>
                        </div>
                        <div class="code-block">
                            <pre><code class="language-java">// 获取锁的操作
boolean acquireLock = redisClient.set(lockKey, lockValue, "NX", "PX", lockTimeout);
if (acquireLock) {
    try {
        // 执行任务
        ...
        // 定期刷新锁的过期时间
        redisClient.expire(lockKey, newTimeout);
    } finally {
        // 释放锁
        redisClient.del(lockKey);
    }
}</code></pre>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Strategy 2 -->
            <div class="bg-white rounded-2xl shadow-xl overflow-hidden card-hover">
                <div class="flex">
                    <div class="w-24 flex items-center justify-center bg-gradient-to-br from-green-400 to-teal-500">
                        <span class="section-number text-white">2</span>
                    </div>
                    <div class="flex-1 p-8">
                        <h3 class="text-2xl font-bold mb-4 text-gray-800">
                            <i class="fas fa-sync-alt mr-3 text-teal-500"></i>
                            使用分布式锁的可续约机制
                        </h3>
                        <p class="text-gray-700 mb-6 leading-relaxed">
                            可以在分布式锁的实现中引入锁续约机制，使得在任务处理过程中可以主动续期。许多分布式锁实现（如 Redisson）提供了这种功能。
                        </p>
                        <div class="bg-gray-50 rounded-lg p-4 mb-6">
                            <ul class="space-y-3">
                                <li class="flex items-start">
                                    <i class="fas fa-check-circle text-green-500 mt-1 mr-3"></i>
                                    <span class="text-gray-700">使用 Redis 的 <code class="bg-gray-200 px-2 py-1 rounded text-sm">SET</code> 命令的 <code class="bg-gray-200 px-2 py-1 rounded text-sm">PX</code> 参数设置锁的过期时间，并在任务处理中通过程序逻辑定期续约。</span>
                                </li>
                                <li class="flex items-start">
                                    <i class="fas fa-check-circle text-green-500 mt-1 mr-3"></i>
                                    <span class="text-gray-700">利用分布式锁库（如 Redisson）的 <code class="bg-gray-200 px-2 py-1 rounded text-sm">RLock</code> 类的 <code class="bg-gray-200 px-2 py-1 rounded text-sm">lock()</code> 方法，该方法支持自动续约。</span>
                                </li>
                            </ul>
                        </div>
                        <div class="code-block">
                            <pre><code class="language-java">// 使用 Redisson 的 RLock 进行锁操作
RLock lock = redissonClient.getLock(lockKey);
lock.lock();
try {
    // 执行任务
} finally {
    lock.unlock();
}</code></pre>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Strategy 3 -->
            <div class="bg-white rounded-2xl shadow-xl overflow-hidden card-hover">
                <div class="flex">
                    <div class="w-24 flex items-center justify-center bg-gradient-to-br from-blue-400 to-indigo-500">
                        <span class="section-number text-white">3</span>
                    </div>
                    <div class="flex-1 p-8">
                        <h3 class="text-2xl font-bold mb-4 text-gray-800">
                            <i class="fas fa-stopwatch mr-3 text-blue-500"></i>
                            使用合适的过期时间
                        </h3>
                        <p class="text-gray-700 leading-relaxed">
                            在设置锁的过期时间时，需要确保过期时间足够长以覆盖任务的最大处理时间。可以通过对任务进行性能分析，估算最大处理时间来设置合理的锁过期时间。
                        </p>
                    </div>
                </div>
            </div>

            <!-- Strategy 4 -->
            <div class="bg-white rounded-2xl shadow-xl overflow-hidden card-hover">
                <div class="flex">
                    <div class="w-24 flex items-center justify-center bg-gradient-to-br from-purple-400 to-pink-500">
                        <span class="section-number text-white">4</span>
                    </div>
                    <div class="flex-1 p-8">
                        <h3 class="text-2xl font-bold mb-4 text-gray-800">
                            <i class="fas fa-robot mr-3 text-purple-500"></i>
                            实现锁的自动续期
                        </h3>
                        <p class="text-gray-700 mb-6 leading-relaxed">
                            在一些场景中，可以实现锁的自动续期功能。这可以通过以下方法实现：
                        </p>
                        <div class="bg-gray-50 rounded-lg p-4">
                            <ul class="space-y-3">
                                <li class="flex items-start">
                                    <i class="fas fa-cog text-purple-500 mt-1 mr-3"></i>
                                    <span class="text-gray-700"><strong>使用定时任务：</strong>启动一个定时任务定期检查和续期锁，以确保在任务处理完成之前锁不会过期。</span>
                                </li>
                                <li class="flex items-start">
                                    <i